package com.zw.a.basic.a10.demo03_listiterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

//案例: 演示并发修改异常.
/*
    并发修改异常简介:
        问题描述:
            当使用普通迭代器(Iterator)遍历集合的同时, 又往集合中添加了元素, 就会报并发修改异常.
        产生原因:
            迭代器是依赖于集合而存在, 当判断成功后, 集合中添加了新的元素, 而迭代器不知道, 所以就报错了.
            其实这个问题说的是: 迭代器遍历集合中的元素时, 不要使用集合对象去修改集合中的元素.
        解决方案:
            1. 通过 列表迭代器(ListIterator)来解决.
                细节一: 必须使用列表迭代器中的添加元素的方法.    ListIterator#add();
                细节二: 这种方式添加的元素是在刚才迭代到的元素后边的.
            2. 通过for循环 + size()方法来解决.
                细节一: 这种方式添加的元素是在集合的最后位置添加的.
            3. 通过CopyOnWriteArrayList集合解决.
 */
public class Demo02 {
    public static void main(String[] args) {
        //1.创建List集合, 用来存储字符串.
        List<String> list = new ArrayList<>();
        //2.往List集合中添加3个字符串值, 分别是: "hello", "world", "java".
        list.add("hello");
        list.add("world");
        list.add("java");
        //3.判断集合中是否有"world"元素, 如果有, 就往集合中添加一个"JavaEE".
        //方式一: 使用普通的迭代器实现,  会报并发修改异常.
        /*Iterator<String> it = list.iterator();
        while(it.hasNext()) {
            String s = it.next();
            //判断是否是"world", 如果是, 就添加"JavaEE"
            if ("world".equals(s)) {
                list.add("JavaEE");   //并发
            }
        }*/

        //方式二: 使用列表迭代器实现.
       /* ListIterator<String> lit = list.listIterator();
        while(lit.hasNext()) {
            String s = lit.next();
            //判断是否是"world", 如果是, 就添加"JavaEE"
            if ("world".equals(s)) {
                //细节一: 必须使用列表迭代器中的添加元素的方法.    ListIterator#add();
                lit.add("JavaEE");   //并发
            }
        }*/

       //方式三: 使用for + size()解决.
        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            //判断是否是"world", 如果是, 就添加"JavaEE"
            if ("world".equals(s)) {
                list.add("JavaEE");   //并发
            }
        }

        //4. 打印集合
        System.out.println("list: " + list);
    }
}
